/**
 * Author@ Cheng Feitian
 * Date: 2021-4-4
 * Description: 继承方式
 * 子类可以缩小权限值，但不可以扩大权限值
 */

#include <algorithm>
#include <iostream>
#include <string>

using namespace std;
const int maxn = 1024;

// 以下三种继承方式 均不能访问到父类的私有属性值
//公有继承  子类对父类的属性的权限不做任何修改
class Base1
{
public:
    int m_A;

protected:
    int m_B;

private:
    int m_C;
};

class Son1 : public Base1
{
public:
    void func()
    {
        m_A = 10; //父类中的公共权限成员  到子类中依然是公共权限
        m_B = 10; //父类中的保护权限成员  到子类中依然是保护权限
        // m_C = 10;   //父类中的私有权限成员  子类访问不到
    }
};
//保护继承  子类继承的父类的属性全部设置为 protected
class Son2 : protected Base1
{
public:
    void func()
    {
        m_A = 100;
        m_B = 100;
        // m_C = 100;  //子类访问不到
    }
};
//私有继承  子类继承的父类的属性全部设置为 private
class Son3 : private Base1
{
public:
    void func()
    {
        m_A = 100;  //父类中公共成员    到子类中变为    私有成员
        m_B = 100;  //父类中保护成员    到子类中变为    私有成员 
        // m_C = 100; //父类中的私有成员，子类访问不到
    }
};

class GrandSon3:public Son3{
    public:
    void func(){
        // m_A = 1000; //到了Son3中    m_A变为私有 即使是儿子也是访问不到
        // m_B = 1000; //到了Son3中    m_A变为私有 即使是儿子也是访问不到
    }
};

void test01()
{
    Son1 son1;
    son1.m_A = 100;
    // son1.m_B = 100; //到son1中  m_B是保护权限   类外访问不到
}

void test02()
{
    Son2 son2;
    // son2.m_A = 10;  //到son2中  m_A是保护权限   权限属性缩小        类外访问不到
    // son2.m_B = 10;  //到son2中  m_B是保护权限   权限属性没有修改    类外访问不到
}

void test03(){
    Son3 son3;
    // son3.m_A = 1000;    //到son3中  m_A是私有权限   权限属性缩小    类外不可访问
    // son3.m_B = 1000;    //到son3中  m_B是私有权限   权限属性缩小    类外访问不到
}

int main()
{

    return 0;
}
